// 云对象入口文件//海康接口
const rp = require('request-promise');
const config = require('./config.js'); // 基础配置，不存储动态令牌

// 令牌缓存（模块内共享，避免重复请求）
let tokenCache = {
  access_token: '',
  expTime: 0 // 过期时间戳（毫秒）
};

/**
 * 获取有效令牌（优先使用缓存，过期则重新请求）
 * @returns {string|null} 有效令牌（失败返回null）
 */
async function getToken() {
  // 1. 检查缓存是否有效
  if (tokenCache.expTime && tokenCache.expTime > Date.now()) {
    return tokenCache.access_token; // 缓存有效，直接返回
  }

  // 2. 缓存无效，重新请求令牌
  const options = {
    method: 'POST',
    uri: config.tokenUrl,
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded'
    },
    form: { // POST表单参数（正确）
      client_id: config.client_id,
      client_secret: config.client_secret,
      grant_type: config.grant_type,
    },
    json: true // 自动解析响应为JSON
  };

  try {
    const response = await rp(options); // 注意：变量名是response，不是res
    if (response.access_token) {
      // 更新缓存
      tokenCache.access_token = response.access_token; // 修正：res→response
      tokenCache.expTime = Date.now() + (response.expires_in * 1000); // 计算过期时间
      return tokenCache.access_token; // 返回有效令牌
    } else {
      // 接口返回成功，但无token（异常情况）
      console.error('获取Token失败：接口返回无access_token', response);
      return null; // 返回null标识失败
    }
  } catch (error) {
    // 请求失败（网络错误、接口报错等）
    console.error('获取Token请求失败：', error.message, error.stack);
    return null; // 返回null标识失败
  }
}

module.exports = {
  /**
   * 获取视频相关令牌
   */
  async getVideoToken() {
    const token = await getToken();
    if (!token) {
      return { code: 0, errMsg: '获取token失败' };
    }

    const options = {
      method: 'GET',
      uri: "https://api2.hik-cloud.com/v1/ezviz/account/info",
      headers: {
        Authorization: `bearer ${token}`
      },
      json: true // 自动解析JSON响应
    };

    try {
      const response = await rp(options);
      return response ; // 成功返回数据
    } catch (error) {
      console.error('获取取流信息失败：', error.message);
      return { code: 0, errMsg: '获取取流信息失败', error: error.message }; // 明确返回错误
    }
  },

  /**
   * 获取区域列表
   * @param {number} pageNo - 页码
   * @param {number} pageSize - 每页条数
   */
  async getAreas(pageNo, pageSize) {
    const token = await getToken();
    if (!token) {
      return { code: 0, errMsg: '获取token失败' };
    }

    const options = {
      method: 'GET',
      uri: "https://api2.hik-cloud.com/v1/customization/areas/list",
      headers: {
        Authorization: `bearer ${token}`
      },
      qs: { // GET请求用qs传递查询参数（form用于POST表单）
        pageNo: pageNo,
        pageSize: pageSize
      },
      json: true
    };

    try {
      const response = await rp(options);
      return response ; // 成功返回数据
    } catch (error) {
      console.error('获取区域列表失败：', error.message);
      return { code: 0, errMsg: '获取区域列表失败', error: error.message };
    }
  },
  /**
   * @param {Number} pageNo -页号
   * @param {Number} pageSize -每页数
   * @param {string} storeNo -指定仓库Id号非必填
   */
  
async getStoreList(pageNo,pageSize,storeNo){
	const token = await getToken();
	  if (!token) {
	    return { code: 0, errMsg: '获取token失败' };
	  }
	
	  const options = {
	    method: 'GET',
	    uri: "https://api2.hik-cloud.com/v1/customization/storeInfo",
	    headers: {
	      Authorization: `bearer ${token}`
	    },
	    qs: {
		
	      pageNo: pageNo,
	      pageSize: pageSize,
		  storeNo:storeNo
	    },
	    json: true
	  };
	
	  try {
	    const response = await rp(options);
		console.log('获取门店列表',JSON.stringify(response));
	    return response ; // 成功返回数据
	  } catch (error) {
	    console.error('获取门店列表失败：', error.message);
	    return { code: 0, errMsg: '获取问店列表失败', error: error.message };
	  }
	
},  
  
  
  /**
   * @param {string} storeId -仓库Id
   * @param {Number} pageNo -页码
   * @param {Number} pageSize -每页数量
   */
  
async  getCameraList(storeId,pageNo,pageSize){
	const token = await getToken();
	  if (!token) {
	    return { code: 0, errMsg: '获取token失败' };
	  }
	
	  const options = {
	    method: 'GET',
	    uri: "https://api2.hik-cloud.com/v1/customization/cameraList",
	    headers: {
	      Authorization: `bearer ${token}`
	    },
	    qs: { // GET请求用qs传递查询参数（form用于POST表单）
		  storeId:storeId,
	      pageNo: pageNo,
	      pageSize: pageSize
	    },
	    json: true
	  };
	
	  try {
	    const response = await rp(options);
	    return response ; // 成功返回数据
	  } catch (error) {
	    console.error('获取门店通道列表失败：', error.message);
	    return { code: 0, errMsg: '获取问店通道列表失败', error: error.message };
	  }
	},
 
  /**
   * 地址转GPS坐标
   * @param {string} address - 地址字符串
   */
  async getAddressToGps(address) {
    const options = {
      method: 'GET',
      uri: 'https://restapi.amap.com/v3/geocode/geo',
      qs: {
        address: address,
        key: '2642eb892bac2acb0eeacc2dc524ff1b' // 建议将key移到config.js中
      },
      headers: {
        'User-Agent': 'Request-Promise'
      },
      json: true
    };

    try {
      const res = await rp(options);
      return {code:true,data:res}
    } catch (error) {
      console.error('地址转GPS失败：', error.message);
      return { code: 0, errMsg: '地址转GPS失败', error: error.message };
    }
  }
};